﻿using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Zhaoxi.SqlSugar.Common;
using Zhaoxi.SqlSugar.Models;

namespace Zhaoxi.SqlSugarAdvanced.SaasSubDatabase
{
    // <summary>
    /// 数据库管理 - CS端的数据库管理用这个就可以了
    /// DbManger的核心功能是将不同的数据库配置成不同的操作对象，方便数据库操作使用
    /// </summary>
    public class DbManger
    {
        /// <summary>
        /// 获取业务库对象 （用IOC这块代码不能写到IOC里面）
        /// </summary>
        public static ISqlSugarClient BizDb
        {
            get
            {
                //根据Token获取用户信息和连接字符串信息
                UserInfo user = GetUserInfo(); //可以去读取配置，得到配置信息
                var configId = user.OrgId.ToString();//集团ID（也可以叫租户ID）
                if (!Db.IsAnyConnection(configId))
                {
                    //用非默认ConfigId进行测试
                    //添加业务库只在当前上下文有效（原理：SqlSugarScope模式入门文档去看）
                    Db.AddConnection(new ConnectionConfig()
                    {
                        ConfigId = configId,
                        ConnectionString = user.Connection,
                        DbType = DbType.SqlServer,
                        IsAutoCloseConnection = true
                    });
                }
                //原理说明
                //IsAnyConnection、AddConnection和GetConnection 都是Scope周期不同请求不会有影响 
                var result = Db.GetConnection(configId);
                //可以给业务库result设置AOP
                return result;
            }
        }

        /// <summary>
        /// 获取配置库对象
        /// </summary>
        public static ISqlSugarClient BizDbNew
        {
            get
            {
                //根据Token获取用户信息和连接字符串信息
                UserInfo user = GetUserInfo(); //可以去读取配置，得到配置信息
                var configId = user.OrgId.ToString();//集团ID（也可以叫租户ID）
                if (!Db.IsAnyConnection(configId))
                {
                    //用非默认ConfigId进行测试
                    //添加业务库只在当前上下文有效（原理：SqlSugarScope模式入门文档去看）
                    Db.AddConnection(new ConnectionConfig() // 添加数据库配置链接
                    {
                        ConfigId = configId,
                        ConnectionString = user.Connection,
                        DbType = DbType.SqlServer,
                        IsAutoCloseConnection = true
                    });
                }
                //原理说明
                //IsAnyConnection、AddConnection和GetConnection 都是Scope周期不同请求不会有影响 
                var result = Db.GetConnection(configId);
                //可以给业务库result设置AOP
                return result;
            }
        }
         
        /// <summary>
        /// 获基础信息库对象 （用IOC这块代码不能写到IOC里面）
        /// </summary>
        public static ISqlSugarClient MasterDb
        {
            get
            {
                //如果是跨服务器分库，也需要动态配置的，因为库的IP会变
                //参考业务库用法
                return Db.GetConnection("default");
            }
        }
         
        /// <summary>
        /// 如果没有多个数据库的话，只配这一个就可以了
        /// 可以获取到数据库操作连接 - 这是一个数据库连接属性
        /// 利用SqlSugarScope单例+多租户来处理多库事务
        /// （使用 IOC 在初始化注入，IOC只注入这一块代码，其他不要写到注入）
        /// </summary>
        public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
        {
            ConfigId = "default",
            DbType = DbType.SqlServer,
            ConnectionString = CustomConnectionConfig.ConnectionString001,
            IsAutoCloseConnection = true
        },
         db =>
         {
             //基础库AOP
             db.Aop.OnLogExecuting = (s, p) => // 用于记录sql输出
             {

             };
         });

        /// <summary>
        /// 获取用户数据库连接字符串信息 - 模拟读取配置信息
        /// </summary>
        /// <returns></returns>
        private static UserInfo GetUserInfo()
        {
            //读数据库配置一般会有缓存，不然浪费性能 
            return new UserInfo()
            {
                Connection = CustomConnectionConfig.ConnectionString001,
                OrgId = 1,
                CreateTime = DateTime.Now,
                Name = "Richard老师",
                uId = Guid.NewGuid()
            };
        }

    }
}
